package etm.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import etm.excepcion.DAOExcepcion;
import upc.condominio.modelo.*;
import upc.condominio.util.ConexionBD;

public class QuejaDAO extends BaseDAO {

	public Collection<Queja> buscarPorResidente(String dato) throws DAOExcepcion {
		System.out.println("RolDAO: buscarPorNombre(String nombre)");
		String strQuery =	" select q.idqueja, r.idresidente, q.fechaqueja, q.idtipoqueja, q.motivo, q.Descripcion, q.IdEstado " +
							" from condominio.queja q " +
							" inner join condominio.residente r on (q.idresidente = r.idresidente) " +
							" where r.ApellidoMaterno like ? or r.ApellidoPaterno like ? or r.Nombres like ? ;";
		Collection<Queja> lista = new ArrayList<Queja>();
		Residente rsResidente = null;
		ResidenteDAO daoResidente =null;
		TipoQueja tqTipoqueja = null;
		TipoQuejaDAO daoTipoQueja = null;
		Estado estEstado = null;
		EstadoDAO daoEstado = null;
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(strQuery);
			stmt.setString(1, "%" + dato + "%");
			stmt.setString(2, "%" + dato + "%");
			stmt.setString(3, "%" + dato + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Queja vo = new Queja();
				vo.setIdQueja(rs.getInt("idqueja"));
				//Residente
				daoResidente = new ResidenteDAO();
				rsResidente = daoResidente.buscarporId(rs.getInt("idresidente"));
				vo.setRsResidente(rsResidente);
				
				vo.setFechaQueja(rs.getDate("fechaqueja"));
				
				// tipoQueja
				daoTipoQueja = new TipoQuejaDAO();
				tqTipoqueja = daoTipoQueja.BuscarporId(rs.getString("idtipoqueja"));
				vo.setTipoQueja(tqTipoqueja);
//				vo.setTipoQueja(rs.getString("tipoqueja"));
				
				vo.setMotivo(rs.getString("motivo"));
				vo.setDescripcion(rs.getString("Descripcion"));
				
				//Estado
				daoEstado = new EstadoDAO();
				estEstado = daoEstado.BuscarporId(rs.getString("idEstado"));
				vo.setEstEstado(estEstado);
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}
	
	public Collection<Queja> buscarPorFechasEstado(Date datFechaInicio, Date datFechaFin, String strEstado) throws DAOExcepcion {
		System.out.println("RolDAO: buscarPorFechasEstado(Date datFechaInicio, Date datFechaFin, String strEstado)");
		System.out.println("Parametro 1: " + datFechaInicio);
		System.out.println("Parametro 2: " + datFechaFin);
		System.out.println("Parametro 3: " + strEstado);
		String strQuery =	" select q.idqueja, q.idresidente, q.fechaqueja, q.idtipoqueja, q.motivo, q.Descripcion, q.idEstado " +
							" from condominio.queja q " +
							" where (q.fechaqueja between ? and ?) and (q.idestado = ? or ? = '%')  ;";
		Collection<Queja> lista = new ArrayList<Queja>();
		Residente rsResidente = null;
		ResidenteDAO daoResidente =null;
		TipoQueja tqTipoqueja = null;
		TipoQuejaDAO daoTipoQueja = null;
		Estado estEstado = null;
		EstadoDAO daoEstado = null;
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(strQuery);
			stmt.setDate(1, datFechaInicio);
			stmt.setDate(2, datFechaFin );
			stmt.setString(3,strEstado);
			stmt.setString(4,strEstado );
			rs = stmt.executeQuery();
			while (rs.next()) {
				Queja vo = new Queja();
				vo.setIdQueja(rs.getInt("idqueja"));
				//Residente
				daoResidente = new ResidenteDAO();
				rsResidente = daoResidente.buscarporId(rs.getInt("idresidente"));
				vo.setRsResidente(rsResidente);
				
				vo.setFechaQueja(rs.getDate("fechaqueja"));
				
//				vo.setTipoQueja(rs.getString("tipoqueja"));
				// tipoQueja
				daoTipoQueja = new TipoQuejaDAO();
				tqTipoqueja = daoTipoQueja.BuscarporId(rs.getString("idtipoqueja"));
				vo.setTipoQueja(tqTipoqueja);
				
				vo.setMotivo(rs.getString("motivo"));
				vo.setDescripcion(rs.getString("Descripcion"));
//				vo.setTipoQueja(rs.getString("tipoqueja"));
				
				//Estado
				daoEstado = new EstadoDAO();
				estEstado = daoEstado.BuscarporId(rs.getString("idEstado"));
				vo.setEstEstado(estEstado);
				
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}
	
	public Queja buscarPorId(int intIdQueja) throws DAOExcepcion {
		Queja q = null;
		String strQuery =	" select q.idqueja, q.idresidente, q.fechaqueja, q.idtipoqueja, q.motivo, q.Descripcion, q.idEstado " +
							" from condominio.queja q " +
							" where q.idqueja = ? ;";
		Residente rsResidente = null;
		ResidenteDAO daoResidente =null;
		Estado estEstado = null;
		EstadoDAO daoEstado = null;
		TipoQueja tqTipoqueja = null;
		TipoQuejaDAO daoTipoQueja = null;
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(strQuery);
		stmt.setInt(1, intIdQueja);
		rs = stmt.executeQuery();
		while (rs.next()) {
			q = new Queja();
			
			q.setIdQueja(rs.getInt("idqueja"));
			//Residente
			daoResidente = new ResidenteDAO();
			rsResidente = daoResidente.buscarporId(rs.getInt("idresidente"));
			q.setRsResidente(rsResidente);
			
			q.setFechaQueja(rs.getDate("fechaqueja"));
//			q.setTipoQueja(rs.getString("tipoqueja"));
			// tipoQueja
			daoTipoQueja = new TipoQuejaDAO();
			tqTipoqueja = daoTipoQueja.BuscarporId(rs.getString("idtipoqueja"));
			q.setTipoQueja(tqTipoqueja);
			
			q.setMotivo(rs.getString("motivo"));
			q.setDescripcion(rs.getString("Descripcion"));
			
			//Estado
			daoEstado = new EstadoDAO();
			estEstado = daoEstado.BuscarporId(rs.getString("idEstado"));
			q.setEstEstado(estEstado);
		}
		} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
		} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
		}
		return q;
	}
	
	public void insertar(Queja vo) throws DAOExcepcion {
		System.out.println("QuejaDAO: insertar(Queja vo)");
		String strQuery = 	" INSERT INTO Queja(idresidente, FechaQueja, idTipoQueja, Motivo, descripcion, idEstado) "+
							" VALUES (?,?,?,?,?,'PE')";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(strQuery);
			stmt.setInt(1, vo.getRsResidente().getIdResidente());
			stmt.setDate(2, vo.getFechaQueja());
			stmt.setString(3, vo.getTipoQueja().getIdTipoQueja());
			stmt.setString(4, vo.getMotivo());
			stmt.setString(5, vo.getDescripcion());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar en Queja");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public void eliminar(int intIdQueja) throws DAOExcepcion {
		System.out.println("QuejaDAO: eliminar(int intIdQueja)");
		String StrQuery = "Update Queja set IDestado ='AN' WHERE idqueja=?; ";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			Queja q = buscarPorId(intIdQueja);
			
//			if (q.getEstEstado().getIdEstado().equalsIgnoreCase("AN")) {
//				throw new SQLException("el registro ya se encuentra anulado.");
//			}
			
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(StrQuery);
			stmt.setInt(1, intIdQueja);
			int i = stmt.executeUpdate();
			if (i != 1) {

				throw new SQLException("No se pudo anular el registro.");
//				return false;
			}
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
//			return false;
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
//		return true;
	}
	
	public void actualizar(Queja vo) throws DAOExcepcion {
		System.out.println("QuejaDAO: actualizar(Queja vo)");
		String query = "update queja set idresidente=?, idtipoqueja=?, motivo=?,descripcion=?  where idqueja=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, vo.getRsResidente().getIdResidente());
			stmt.setString(2, vo.getTipoQueja().getIdTipoQueja());
			stmt.setString(3, vo.getMotivo());
			stmt.setString(4, vo.getDescripcion());
			stmt.setInt(5, vo.getIdQueja());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar el registro Queja");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
}
